package com.yunji.common.base;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.page.PageMethod;
import com.github.yulichang.base.MPJBaseService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;

import java.util.List;

/**
 * @author : peter-zhu
 * @date : 2024/10/19 16:56
 * @description : TODO
 **/
public interface IBaseDao<T> extends MPJBaseService<T> {


    default <DTO> List<DTO> pageJoinList(Class<DTO> clazz, PageDTO pageParam, MPJLambdaWrapper<T> joinWrapper) {
        try (Page<Object> joinPage = PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize())) {
            List<DTO> data = selectJoinList(clazz, joinWrapper);
            pageParam.setTotal(new PageInfo<>(data).getTotal());
            return data;
        } finally {
            PageMethod.clearPage();
        }
    }

    default List<T> pageList(PageDTO pageParam, Wrapper<T> queryWrapper) {
        try (Page<Object> p = PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize())) {
            List<T> data = list(queryWrapper);
            pageParam.setTotal(new PageInfo<>(data).getTotal());
            return data;
        } finally {
            PageMethod.clearPage();
        }
    }

    default List<T> pageList(PageDTO pageParam) {
        try (Page<Object> p = PageMethod.startPage(pageParam.getPageNum(), pageParam.getPageSize())) {
            List<T> data = list();
            pageParam.setTotal(new PageInfo<>(data).getTotal());
            return data;
        } finally {
            PageMethod.clearPage();
        }
    }

    default boolean modifyStatusById(IModifyStatusBaseBO<?> modify, SFunction<T, ?> idColumn, SFunction<T, ?> statusColumn) {
        return lambdaUpdate().set(statusColumn, modify.getNewStatus())
                .eq(idColumn, modify.getId()).in(statusColumn, modify.getOldStatus()).update();
    }

    default boolean modifyStatusById(LambdaUpdateChainWrapper<T> update, IModifyStatusBaseBO<?> modify, SFunction<T, ?> idColumn, SFunction<T, ?> statusColumn) {
        return update.set(statusColumn, modify.getNewStatus())
                .eq(idColumn, modify.getId()).in(statusColumn, modify.getOldStatus()).update();
    }
}
